package com.yfux.springbootparam.controller;

import com.yfux.springbootparam.pojo.Result;
import com.yfux.springbootparam.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class ParamController {

    @RequestMapping("/simpleParam")
    public Result simpleParam(@RequestParam(value = "name", required = false) String username, Integer age) {
        // 简单参数的传递参数名一致即可，如果不一致，会变null 可以使用@RequestParam("指定请求参数名")
        // RequestParam的required默认为true，代表必须有该参数，如果没有则会报错，可以通过手动指定为false解决
        String s = "name: " + username + ", age: " + age;
        System.out.println(s);
        return Result.success(s);
    }

    @RequestMapping("/simpleParamOrigin")
    public Result simpleParamOrigin(HttpServletRequest request) {
        // 原始的获取请求参数的方法是从HttpServletRequest中获取 并且获取的都是String类型，需要自己手动转化。
        String name = request.getParameter("name");
        String ageStr = request.getParameter("age");
        Integer age = Integer.parseInt(ageStr);
        String s = "name: " + name + ", age: " + age;
        return Result.success(s);
    }

    @RequestMapping("/pojoParam")
    public Result pojoParam(User user) {
        // 注意请求参数与实体类的成员名称一致 并且实体类必须具有setter
        // 请求参数丢失或者匹配不上 实体类对应属性就为类型默认值 如果请求参数多了会被忽略
        // 对于复杂实体类 请求参数使用.来访问实体类的成员的成员
        System.out.println(user);
        return Result.success(user);
    }

    @RequestMapping("/arrayParam")
    public Result arrayParam(String[] hobby) {
        // 请求参数同名（与参数名相同）的键对应不同的值即可
        // 多选框传过来的就是数组
        String s = Arrays.toString(hobby);
        System.out.println(s);
        return Result.success(hobby);
    }

    @RequestMapping("/arrayParam2")
    public Result arrayParam2(String[] hobby, Integer count) {
        // 请求参数同名（与参数名相同）的键对应不同的值即可 顺序无所谓
        String s = Arrays.toString(hobby) + ": " + count;
        System.out.println(s);
        return Result.success(s);
    }

    @RequestMapping("/listParam")
    public Result listParam(@RequestParam("hobby") List<String> hobby) {
        // list类型的参数需要加上RequestParam 不指定value意为同名
        System.out.println(hobby);
        return Result.success(hobby);
    }

    @RequestMapping("/dateParam")
    public Result dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime) {
        // 注意pattern的大小写严格 可以参考文档 hh表示12小时制 HH表示24小时制
        System.out.println(localDateTime);
        return Result.success(localDateTime);
    }

    @RequestMapping("/jsonParam")
    public Result jsonParam(@RequestBody User user) {
        // 必须加RequestBody注解
        // json键与pojo的属性名对应即可
        System.out.println(user);
        return Result.success(user);
    }

    @RequestMapping("/pathParam/{id}/{username}")
    public Result pathParam(@PathVariable Integer id, @PathVariable("username") String name) {
        // 变量中用{}将参数括起来
        // 必须加PathVariable注解 可指定请求参数名称 请求参数名称和参数名称一致可省略
        // PathVariable的required默认也为true
        String s = "id: " + id + ", name: " + name;
        System.out.println(s);
        return Result.success(s);
    }

}
